#include <mqueue.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>

static char *mq_name = "/test_mq";  //队列名称  /表示/dev/mqueue
static mqd_t mq_fd;  //队列描述符

//再后发送消息的线程
void *first_thread_func(void *arg){
    sleep(1);
    printf("first :发送消息到队列\n");
    char *buf = "hello";
    //发送消息到消息队列(队列描述符、消息、消息长度、优先级)
    mq_send(mq_fd, buf, strlen(buf)+1, 1);
    return NULL;
}
//先接收消息的线程
void *second_thread_func(void *arg){
    printf("first :接收消息从队列\n");
    //接收长度要大于等于创建时的长度
    char buf[100];
    //接收消息从消息队列(队列描述符、消息、消息长度、不为NULL则接收消息的优先级)
    ssize_t len= mq_receive(mq_fd, buf, 100, NULL);
    printf("接收到的消息：%s\n,长度：%ld\n", buf, (int)len);
    return NULL;
}

int main(int argc, char const *argv[])
{
    //创建消息队列属性结构体
    struct mq_attr attr;
    attr.mq_maxmsg = 10;  //队列中最大消息数
    attr.mq_msgsize = 100;  //每个消息的最大字节数

    //创建消息队列(名称、文件属性不存在文件时创建+读写，user读写其他读权限，属性)
    mq_fd = mq_open(mq_name, O_CREAT | O_RDWR, 0644, &attr);
    if(mq_fd==-1){
        printf("创建消息队列失败\n");
        return -1;
    }

    //线程创建与插队
    pthread_t pt1, pt2;
    pthread_create(&pt1, NULL, first_thread_func, NULL);
    pthread_create(&pt2, NULL, second_thread_func, NULL);
    pthread_join(pt1, NULL);
    pthread_join(pt2, NULL);

    //关闭消息队列
    mq_close(mq_fd);
    //删除消息队列（必须都关闭才能清除）
    mq_unlink(mq_name);

    return 0;
}



